// 是控制页面登录权限的文件
// 权限拦截在路由跳转，导航守卫，不需要导出，因为在main.js引入了
import router from './router'
// 引入 store 实例，跟组件中的 this.$store 一样
import store from '@/store'
// 引入进度条
import nprogress from 'nprogress'
// 引入进度条样式
import 'nprogress/nprogress.css'
// 全局前置导航守卫
// next 是前置守卫必须执行的钩子，next必须执行，如果不执行，页面就停止了
// next() 放过
// next(false) 跳转中止
// next(地址) 跳转到某个地址
// 定义白名单，根据路由配置
const whiteList = ['/login', '/404']
router.beforeEach(async (to, from, next) => {
   // 开启进度条
   nprogress.start()
   if (store.getters.token) {
      // 如果有token
      if (to.path === '/login') {
         // 如果有token ，我要访问的是登录页,那么免登录跳转到主页
         // 有token 才能获取资料
         // 有token 不用处理
         // 有token访问 登录页就不需要 资料，只有不去登录页，
         // 放行的时候才去获取用户资料
         next('/')
      } else {
         // 不是访问登录页，就放行
         // 只有放行的时候才去获取用户资料
         // 如果之前已经获取过了资料，那么直接放行，如果没有获取过那么获取才放行
         // 如果当前vuex 中有用户资料的 id 表示 已经有资料了，不需要获取了
         if (!store.getters.userId) {
            // 如果没有 id 才表示当前用户资料没有获取
            // 但是它是异步函数，用户资料还没有获取就放行跳转了
            // 所以没有用户资料就调用获取用户资料然后在跳转
            // 强制等待结束，async + await

            // 获取的就是  store --> modules --> user --> actions中的getUserInfo，
            // 最后一步所 return result 的内容
            // 所以 async 函数 return 的内容用 await 就可以接收到
            // 解构出 roles 获取其中的标识
            const { roles } = await store.dispatch('user/getUserInfo')
            // 后续，需要根据用户资料获取数据，必须改成 同步,强制改
            // 筛选用户的可用路由
            // 筛选得到当前用户可用的动态路由
            // routes 就是筛选得到的动态路由
            // 调用 vuex 的 action 的筛选路由权限的函数，传入标识
            const routes = await store.dispatch(
               'permission/filterRoutes',
               roles.menus
            )
            // console.log(routes)
            // 应该把这个动态路由添加到路由表中，因为默认的路由表只有静态路由，没有动态路由
            // 添加动态路由到路由表，相当于铺路
            // 必须用 next(地址)，不能用 next()
            // 因为现在用的还是 之前的 路由规则，动态添加的没有使用
            // 登录之后不跳到首页，跳转其他页面，就会空白，重新重定向，再次进入 beforeEach
            // 把 404 放到最后
            router.addRoutes([
               ...routes,
               {
                  path: '*',
                  redirect: '/404',
                  hidden: true
               }
            ])

            // 添加完动态路由之后，跳到对应的地址，相当于多做一次跳转
            // 进门了，我要去的地方的路，还没有铺好，不能直接走，要多做一次跳转
            // 再从门外往里进一次，在跳转进来把路铺好，再次进来的时候路就铺好了
            // next('/') 意思就是重新去权限拦截处再次跳转一下
            next(to.path)
         } else {
            next()
         }
      }
   } else {
      // 没有token
      // 判断在不在白名单中（不需要token就能访问的页面）
      // 在白名单中 indexOf 找大于 -1 代表找到，因为索引从 0 开始
      if (whiteList.indexOf(to.path) > -1) {
         // 表示要去的地址在白名单
         next()
      } else {
         // 要去的地址不在白名单，也没有token
         next('/login')
      }
   }
   // 手动强制关闭进度条，为了解决手动跳转时不关闭进度条问题
   nprogress.done()
})
// 后置守卫
router.afterEach(() => {
   // 关闭进度条
   nprogress.done()
})
